<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="utf-8">
  

  
  <title>Anki 自建同步服务器 ankisyncd | ZHB&#39;s Blog</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="Anki 是一个用于记忆的软件，客户端同时支持电脑端和移动端（除了 iOS 上 AnkiMobile 收费以外都是免费的）。如果要使用同步的功能，使用官方的 AnkiWeb 网速较慢，在同步大量的 media 文件的时候十分痛苦。GitHub 上有牛人实现了 Anki 同步的 API 接口，可以自建同步服务器：dsnopek/anki-sync-server。不过这个服务端已经很久没有维护过了，在">
<meta name="keywords" content="Anki">
<meta property="og:type" content="article">
<meta property="og:title" content="Anki 自建同步服务器 ankisyncd">
<meta property="og:url" content="https://gkzhb.github.io/2019/06/ankisyncd/index.html">
<meta property="og:site_name" content="ZHB&#39;s Blog">
<meta property="og:description" content="Anki 是一个用于记忆的软件，客户端同时支持电脑端和移动端（除了 iOS 上 AnkiMobile 收费以外都是免费的）。如果要使用同步的功能，使用官方的 AnkiWeb 网速较慢，在同步大量的 media 文件的时候十分痛苦。GitHub 上有牛人实现了 Anki 同步的 API 接口，可以自建同步服务器：dsnopek/anki-sync-server。不过这个服务端已经很久没有维护过了，在">
<meta property="og:locale" content="zh-Hans">
<meta property="og:updated_time" content="2019-06-23T11:20:20.345Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Anki 自建同步服务器 ankisyncd">
<meta name="twitter:description" content="Anki 是一个用于记忆的软件，客户端同时支持电脑端和移动端（除了 iOS 上 AnkiMobile 收费以外都是免费的）。如果要使用同步的功能，使用官方的 AnkiWeb 网速较慢，在同步大量的 media 文件的时候十分痛苦。GitHub 上有牛人实现了 Anki 同步的 API 接口，可以自建同步服务器：dsnopek/anki-sync-server。不过这个服务端已经很久没有维护过了，在">
  
    <link rel="alternate" href="/atom.xml" title="ZHB&#39;s Blog" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link rel="stylesheet" href="/css/sourcecodepro.css">
    <!-- <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css"> -->
  
  <link rel="stylesheet" href="/css/style.css">
</head>
</html>
<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/" id="logo">ZHB&#39;s Blog</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/">Home</a>
        
          <a class="main-nav-link" href="/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://gkzhb.github.io"></form>
      </div>
    </div>
  </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-ankisyncd" class="article article-type-post" itemscope itemprop="blogPost">



  <div class="article-meta">
    <a href="/2019/06/ankisyncd/" class="article-date">
  <time datetime="2019-06-23T06:35:11.000Z" itemprop="datePublished">2019-06-23</time>
</a>
    
  <div class="article-category">
    <a class="article-category-link" href="/categories/Self-hosting/">Self-hosting</a>
  </div>

  </div>
  <div class="article-inner">
    
    
      <header class="article-header">
        
  
    <h1 class="article-title" itemprop="name">
      Anki 自建同步服务器 ankisyncd
    </h1>
  

      </header>
    
    <div class="article-entry" itemprop="articleBody">
      
		<!-- Table of Contents -->
		
			<div id="toc" class="toc-article">
				<strong class="toc-title">Table of Content</strong>
				<ol class="toc"><li class="toc-item toc-level-2"><a class="toc-link" href="#环境要求"><span class="toc-number">1.</span> <span class="toc-text">环境要求</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#ankisyncd-安装步骤"><span class="toc-number">2.</span> <span class="toc-text">ankisyncd 安装步骤</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#配置环境"><span class="toc-number">2.1.</span> <span class="toc-text">配置环境</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#virtualenv"><span class="toc-number">2.1.1.</span> <span class="toc-text">virtualenv</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#安装-ankisyncd"><span class="toc-number">2.2.</span> <span class="toc-text">安装 ankisyncd</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#运行服务器"><span class="toc-number">2.3.</span> <span class="toc-text">运行服务器</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#anki-客户端设置"><span class="toc-number">3.</span> <span class="toc-text">Anki 客户端设置</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#linux-和-windows-端-anki"><span class="toc-number">3.1.</span> <span class="toc-text">Linux 和 Windows 端 Anki</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#anki-2.1"><span class="toc-number">3.1.1.</span> <span class="toc-text">Anki 2.1</span></a></li><li class="toc-item toc-level-4"><a class="toc-link" href="#anki-2.0"><span class="toc-number">3.1.2.</span> <span class="toc-text">Anki 2.0</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#android-端-ankidroid"><span class="toc-number">3.2.</span> <span class="toc-text">Android 端 Ankidroid</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#同步失败可能的问题排查"><span class="toc-number">4.</span> <span class="toc-text">同步失败可能的问题排查</span></a></li><li class="toc-item toc-level-2"><a class="toc-link" href="#参考"><span class="toc-number">5.</span> <span class="toc-text">参考</span></a></li></ol>
			</div>
		
        <p>Anki 是一个用于记忆的软件，客户端同时支持电脑端和移动端（除了 iOS 上 AnkiMobile 收费以外都是免费的）。如果要使用同步的功能，使用官方的 AnkiWeb 网速较慢，在同步大量的 media 文件的时候十分痛苦。GitHub 上有牛人实现了 Anki 同步的 API 接口，可以自建同步服务器：<a href="https://github.com/dsnopek/anki-sync-server" target="_blank" rel="noopener">dsnopek/anki-sync-server</a>。不过这个服务端已经很久没有维护过了，在电脑上最新的 Anki 已经无法正常同步了。于是我在 Google 上找到了一篇文章：<a href="http://genedan.com/no-127-ankisyncd-a-custom-sync-server-for-anki-2-1/" target="_blank" rel="noopener">ankisyncd – A Custom Sync Server for Anki 2.1 | Gene Dan's Blog</a>。我按照博客里提供的 <a href="https://github.com/tsudoko/anki-sync-server" target="_blank" rel="noopener">tsudoko/anki-sync-server</a> 对应的文档，成功在自己的 VPS 上搭建了服务器，并且在 Ankidroid 上和 Linux 端 2.1.11 版本的 Anki 上成功同步数据。</p>
<p><strong>注意</strong>：</p>
<ul>
<li>iOS 上 AnkiMobile 不支持自定义同步服务器</li>
<li>同步服务器没有 AnkiWeb 的网页端访问支持</li>
<li>ankisyncd 服务器支持 PC 端 Anki 版本 2.1.1 - 2.1.11，其中只有 2.1.9 版本不支持</li>
</ul>
<a id="more"></a>
<h2 id="环境要求">环境要求</h2>
<ul>
<li>Linux（理论上 Windows 应该也可以）</li>
<li>Python3（推荐，python2 估计也行，但没测试过也不推荐）</li>
<li>pip3（基于 Python3 的 pip，和上一条 Python 版本对应）</li>
<li>git（Windows 下注意 git 命令使用环境）</li>
</ul>
<p>环境安装略。</p>
<h2 id="ankisyncd-安装步骤">ankisyncd 安装步骤</h2>
<h3 id="配置环境">配置环境</h3>
<h4 id="virtualenv">virtualenv</h4>
<p>为避免环境问题导致安装或运行出错，推荐使用 virtualenv ，不想安装也可以跳过这一部份内容。通过以下命令安装 virtualenv： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install virtualenv</span><br></pre></td></tr></table></figure></p>
<p>在准备安装服务器的目录下创建 Python 虚拟环境： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> [你想要安装服务器的目录]</span><br><span class="line">virtualenv ankienv</span><br></pre></td></tr></table></figure></p>
<p>注意将 <code>[你想要安装服务器的目录]</code> 替换为你实际的目录的路径，路径不需要加方括号。</p>
<p>然后进入新创建的虚拟环境： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">. ankienv/bin/activate</span><br></pre></td></tr></table></figure></p>
<p>注意以上命令英文的句号后面有一个空格。</p>
<p>输入完成后，命令行前会多出 <code>(ankienv)</code> 表示当前的 Python 环境，之后与 Python 或 pip 有关的所有操作都要在这个环境中进行。</p>
<h3 id="安装-ankisyncd">安装 ankisyncd</h3>
<p>使用 git 来 clone 服务器代码： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/tsudoko/anki-sync-server.git</span><br></pre></td></tr></table></figure></p>
<p>进入代码目录并安装 git 子模块： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> anki-sync-server</span><br><span class="line">git submodule update --init</span><br></pre></td></tr></table></figure></p>
<p>完成后进入 anki-bundled 目录并继续安装 Python 模块环境： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> anki-bundled</span><br><span class="line">pip install -r requirements.txt</span><br></pre></td></tr></table></figure></p>
<p>我在执行这一步的时候报错 pyaudio 安装失败，解决方法是直接把 requirements.txt 文件中 pyaudio 删掉，再重新执行上面的 pip 命令。根据官方文档的说明这个模块不影响服务器同步功能的使用。</p>
<p>继续安装 Python 模块，安装完后进入 <code>anki-sync-server</code> 目录： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pip install webob</span><br><span class="line"><span class="built_in">cd</span> ..</span><br></pre></td></tr></table></figure></p>
<p>最后，还可以修改服务器配置文件：<code>anki-sync-server</code> 目录下的 <code>ankisyncd.conf</code>。对我来说无需更改任何配置。</p>
<p>配置文件里包括 <code>host</code> 对应服务器监听地址，默认 <code>0.0.0.0</code> 表示接收所有 IP 的请求，如果改成 <code>127.0.0.1</code> 则无法接收外网或内网上的请求，也就是只能通过服务器本机访问，改成服务器内网 IP 则只接收内网的请求。<code>port</code> 表示监听端口，如果修改这个参数则客户端连接端口也要对应修改与其相同。<code>data_root</code> 应该是同步数据的保存目录。</p>
<p>到此服务器已经安装完成了。</p>
<h3 id="运行服务器">运行服务器</h3>
<p>如果前面使用了 virtualenv，这一部份的命令仍然需要在 ankienv 环境下运行。运行服务器之前需要先创建用户（继续前面的命令，目前在 <code>anki-sync-server</code> 目录下）： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./ankisyncctl.py adduser &lt;username&gt;</span><br></pre></td></tr></table></figure></p>
<p>将命令中的 <code>&lt;username&gt;</code> 替换为实际的用户名。之后输入密码，按回车确定（Linux 下输入密码不会显示出来）。</p>
<p>最后，启动服务器： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">python -m ankisyncd</span><br></pre></td></tr></table></figure></p>
<p>执行这条命令的时候会一直占用命令行终端，否则表示服务器已停止运行。</p>
<p>如果是通过 ssh 连接到 Linux 服务器在服务器上运行，断开 ssh 连接会自动停止服务器运行，这就需要下面的命令防止进程停止： <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">nohup python -m ankisyncd &amp;</span><br></pre></td></tr></table></figure></p>
<p>当然也可以用 screen 或 tmux 之类的服务器上常用的工具解决这个问题。</p>
<h2 id="anki-客户端设置">Anki 客户端设置</h2>
<h3 id="linux-和-windows-端-anki">Linux 和 Windows 端 Anki</h3>
<h4 id="anki-2.1">Anki 2.1</h4>
<p>在 <a href="https://apps.ankiweb.net/docs/addons.html#_add_on_folders" target="_blank" rel="noopener">Add-on 文件夹</a> 下创建文件夹 <code>ankisyncd</code>，并在其中创建并编辑文件 <code>__init__.py</code>： <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> anki.sync, anki.hooks, aqt</span><br><span class="line"></span><br><span class="line">addr = <span class="string">"http://127.0.0.1:27701/"</span> <span class="comment"># put your server address here</span></span><br><span class="line">anki.sync.SYNC_BASE = <span class="string">"%s"</span> + addr</span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">resetHostNum</span><span class="params">()</span>:</span></span><br><span class="line">    aqt.mw.pm.profile[<span class="string">'hostNum'</span>] = <span class="literal">None</span></span><br><span class="line">anki.hooks.addHook(<span class="string">"profileLoaded"</span>, resetHostNum)</span><br></pre></td></tr></table></figure></p>
<p>将 <code>addr = "http://127.0.0.1:27701/"</code> 行中的 <code>127.0.0.1</code> 换成对应服务器的 IP。<code>27701</code> 对应服务器配置的端口。</p>
<h4 id="anki-2.0">Anki 2.0</h4>
<p>（我也不知道是否支持，但是官方文档上给了相关配置）在 <code>~/Anki/addons</code> 下创建并编辑文件 <code>ankisyncd.py</code>： <figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> anki.sync</span><br><span class="line"></span><br><span class="line">addr = <span class="string">"http://127.0.0.1:27701/"</span> <span class="comment"># put your server address here</span></span><br><span class="line">anki.sync.SYNC_BASE = addr</span><br><span class="line">anki.sync.SYNC_MEDIA_BASE = addr + <span class="string">"msync/"</span></span><br></pre></td></tr></table></figure></p>
<p>同理，把 <code>127.0.0.1</code> 换成服务器的 IP 。<code>27701</code> 为服务器端口。</p>
<h3 id="android-端-ankidroid">Android 端 Ankidroid</h3>
<p>设置 --&gt; 高级设置 --&gt; 自定义同步服务器</p>
<ul>
<li>同步地址：<code>http://127.0.0.1:27701/</code></li>
<li>媒体文件同步地址：<code>http://127.0.0.1:27701/msync</code></li>
</ul>
<p>把以上地址中的 <code>127.0.0.1</code> 换成服务器的 IP 地址。<code>27701</code> 为端口设置。<strong>注意上面两个地址末尾的斜杠有无一定要正确，否则会同步失败</strong>。</p>
<h2 id="同步失败可能的问题排查">同步失败可能的问题排查</h2>
<p>如果服务器能正常运行，而同步无法正确进行，可以尝试以下几个方面的检查：</p>
<ul>
<li>在命令行 <code>ping [服务器 IP 地址]</code> 如果有持续输出表示可以连接上服务器，如果没有结果说明网络连接有问题</li>
<li>检查服务器防火墙，如果是 VPS 在控制台检查防火墙，添加 TCP 规则 27701 端口，Windows 可以尝试关闭所有防火墙</li>
<li>尝试通过浏览器打开链接 http://127.0.0.1:27701 （将 <code>127.0.0.1</code> 换成服务器 IP 或域名），如果网页显示 <code>Anki Sync Server</code> 说明可以访问到服务器</li>
</ul>
<h2 id="参考">参考</h2>
<ul>
<li><a href="http://genedan.com/no-127-ankisyncd-a-custom-sync-server-for-anki-2-1/" target="_blank" rel="noopener">No. 127: ankisyncd – A Custom Sync Server for Anki 2.1 | Gene Dan's Blog</a></li>
<li><a href="https://github.com/tsudoko/anki-sync-server" target="_blank" rel="noopener">tsudoko/anki-sync-server: Self-hosted Anki sync server</a></li>
</ul>
<p>在写完这篇文章后，我发现有几篇博客已经有相关的记录了，这里也贴上链接吧。</p>
<ul>
<li><a href="https://extendswind.top/posts/technical/anki_and_anki_server/" target="_blank" rel="noopener">anki的使用以及anki server的配置 • extendswind</a></li>
<li><a href="https://www.xiebruce.top/881.html" target="_blank" rel="noopener">CentOS7自建Anki同步服务器(python3) | Bruce's Blog</a></li>
</ul>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://gkzhb.github.io/2019/06/ankisyncd/" data-id="cjx8qp12q0003pqw8l4yr3qn1" class="article-share-link">Share</a>
      
      
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/tags/Anki/">Anki</a></li></ul>

    </footer>
  </div>
  
    
<nav id="article-nav">
  
  
    <a href="/2019/04/wallabag/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title">自建”稍后阅读“服务—— wallabag</div>
    </a>
  
</nav>

  
</article>


</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Categories</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Landscape/">Landscape</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Linux/">Linux</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Programming/">Programming</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Self-hosting/">Self-hosting</a></li><li class="category-list-item"><a class="category-list-link" href="/categories/Software/">Software</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/tags/Anki/">Anki</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Blog/">Blog</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Command-Line/">Command Line</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Data-Structure/">Data Structure</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Games/">Games</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Hometown/">Hometown</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Linux/">Linux</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Network/">Network</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Read-It-Later/">Read-It-Later</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Recall/">Recall</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Regular-Expression/">Regular Expression</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Server/">Server</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/Spring/">Spring</a></li><li class="tag-list-item"><a class="tag-list-link" href="/tags/折腾/">折腾</a></li></ul>
    </div>
  </div>


  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      &copy; 2019 Haibin Zhang<br>
      Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/" class="mobile-nav-link">Home</a>
  
    <a href="/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<!-- <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script> -->

<!-- <script src="http://apps.bdimg.com/libs/jquery/2.0.3/jquery.min.js"></script> -->
<script src="/mathjax/MathJax.js?config=TeX-MML-AM_CHTML"></script>
<script src="/js/jquery.min.js"></script>

  <link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
  <script src="/fancybox/jquery.fancybox.pack.js"></script>


<script src="/js/script.js"></script>




  </div>
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
		messageStyle: "none",
		showProcessingMessages: false,
        tex2jax: {
            inlineMath: [ ["$","$"], ["\\(","\\)"] ],
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'],
            processEscapes: true
        }
    });
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax();
        for (var i = 0; i < all.length; ++i)
            all[i].SourceElement().parentNode.className += ' has-jax';
    });
</script>
<!-- <script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script> -->
<script src="/mathjax/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

</body>
</html>